/**
 * @file ErrorHandler.h
 * @brief 错误处理模块头文件
 */

#pragma once

#include "../CLink_Export.h"
#include <string>
#include <exception>
#include <functional>
#include <map>
#include "CLink/error/ErrorCodes.h"

namespace CLink
{
namespace Error
{

/**
 * @class CLinkException
 * @brief 自定义异常类
 */
class CLINK_CLASS CLinkException : public std::exception
{
public:
    /**
     * @brief 构造函数
     * @param code 错误代码
     * @param message 错误消息
     * @param detail 详细信息（可选）
     */
    CLinkException(ErrorCode code, const std::string &message, const std::string &detail = "");

    /**
     * @brief 获取错误代码
     * @return 错误代码
     */
    ErrorCode getCode() const;

    /**
     * @brief 获取错误消息
     * @return 错误消息
     */
    const std::string &getMessage() const;

    /**
     * @brief 获取详细信息
     * @return 详细信息
     */
    const std::string &getDetail() const;

    /**
     * @brief 重写 what 方法
     * @return 错误描述字符串
     */
    const char *what() const noexcept override;

private:
    ErrorCode code_;
    std::string message_;
    std::string detail_;
    mutable std::string fullMessage_;
};

/**
 * @class ErrorHandler
 * @brief 错误处理类
 */
class CLINK_CLASS ErrorHandler
{
public:
    /**
     * @brief 错误处理回调函数类型
     */
    using ErrorCallback = std::function<void(const CLinkException &)>;

    /**
     * @brief 获取单例实例
     * @return ErrorHandler 单例实例
     */
    static ErrorHandler &getInstance();

    /**
     * @brief 注册错误处理回调
     * @param code 错误代码
     * @param callback 回调函数
     */
    void registerErrorCallback(ErrorCode code, ErrorCallback callback);

    /**
     * @brief 注册全局错误处理回调
     * @param callback 回调函数
     */
    void registerGlobalErrorCallback(ErrorCallback callback);

    /**
     * @brief 处理错误
     * @param exception 异常对象
     */
    void handleError(const CLinkException &exception);

    /**
     * @brief 获取错误代码对应的描述
     * @param code 错误代码
     * @return 错误描述
     */
    static std::string getErrorDescription(ErrorCode code);

private:
    /**
     * @brief 构造函数（私有）
     */
    ErrorHandler();

    /**
     * @brief 析构函数（私有）
     */
    ~ErrorHandler();

    // 禁止拷贝和赋值
    ErrorHandler(const ErrorHandler &) = delete;
    ErrorHandler &operator=(const ErrorHandler &) = delete;

    std::map<ErrorCode, ErrorCallback> errorCallbacks_;
    ErrorCallback globalCallback_;
};

/**
 * @brief 抛出异常的辅助函数
 * @param code 错误代码
 * @param message 错误消息
 * @param detail 详细信息（可选）
 */
CLINK_FUNCTION void throwError(ErrorCode code, const std::string &message, const std::string &detail = "");

} // namespace Error
} // namespace CLink